#pragma once

#include <boost/numeric/ublas/vector.hpp>
#include <gsl/gsl_monte_plain.h>
#include "SimResult.h"
#include "filter.h"

class Environment;
class Track;

// Robot interface
class Robot {

public:

	virtual ~Robot() { }

	virtual void Start() = 0;

	virtual void SetEnvironment(Environment *env) = 0;

	// Every step, we are allowed to update our speed and direction, that's it.
	virtual void Step(double t, double dt) = 0;

	// Save current state in the simulation result
	virtual void Save(SimResult::Data &data) = 0;

	// gets the speed of the robot in cm/s.
	// sets the speed by clamping within range
	virtual double GetSpeed() const = 0;

	// returns the angle of the wheels
	// sets the wheel angle by claming within max range
	virtual double GetWheelAngle() const = 0;

	virtual double GetCenterOfMass() const = 0;
	
	virtual double GetWidth() const = 0;

	virtual double GetLength() const = 0;
};
